#ifndef SAFEQUEUE_H
#define SAFEQUEUE_H

#include <QQueue>
#include <QMutex>
#include <QMutexLocker>
#include <QWaitCondition>

// 线程安全的帧队列（存储重组后的完整帧，已去除8字节头）
class SafeFrameQueue {
public:
    SafeFrameQueue(int maxSize = 100) : m_maxSize(maxSize) {} // 最大缓存100帧（1000ms）

    // 存入帧（队列满时丢弃旧帧）
    void enqueue(const QByteArray &frame) {
        QMutexLocker locker(&m_mutex);
        if (m_queue.size() >= m_maxSize) {
            m_queue.dequeue(); // 丢弃最旧帧，保证缓存时效性
            qWarning() << "Frame queue full, drop old frame";
        }
        m_queue.enqueue(frame);
        m_waitCond.wakeOne(); // 唤醒等待的发送线程
    }

    // 取出帧（队列为空时阻塞等待，超时返回空）
    QByteArray dequeue(int timeoutMs = 1000) {
        QMutexLocker locker(&m_mutex);
        // 队列为空时，等待timeoutMs或被唤醒
        if (m_queue.isEmpty() && !m_waitCond.wait(&m_mutex, timeoutMs)) {
            return QByteArray(); // 超时返回空（无新帧）
        }
        if (m_queue.isEmpty()) return QByteArray();
        return m_queue.dequeue();
    }

    // 清空队列（停止时调用）
    void clear() {
        QMutexLocker locker(&m_mutex);
        m_queue.clear();
    }

    // 获取队列当前长度
    int size() {
        QMutexLocker locker(&m_mutex);
        return m_queue.size();
    }

private:
    QQueue<QByteArray> m_queue;
    QMutex m_mutex;
    QWaitCondition m_waitCond;
    const int m_maxSize; // 队列最大长度（防止内存溢出）
};

#endif // SAFEQUEUE_H
